From 09d0d32af0e2b206e21afc6f081bbc8235e58009 Mon Sep 17 00:00:00 2001 From: Thomas Wood Date: Fri, 22 Feb 2013 16:44:13 +0000 Subject: [PATCH] wayland: implement GInitable and check the connection to the display server Add GInitable implementation and fail the initialisation if it is not possible to connect to the display server. https://bugzilla.gnome.org/show_bug.cgi?id=694465 --- gdk/gdkdisplaymanager.c | 8 +++--- gdk/wayland/gdkdisplaymanager-wayland.c | 38 +++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/gdk/gdkdisplaymanager.c b/gdk/gdkdisplaymanager.c index f4706112e8..70b6a62a9d 100644 --- a/gdk/gdkdisplaymanager.c +++ b/gdk/gdkdisplaymanager.c @@ -259,14 +259,14 @@ gdk_display_manager_get (void) if (!manager && (backend == NULL || strcmp (backend, "win32") == 0)) manager = g_initable_new (gdk_win32_display_manager_get_type (), NULL, NULL, NULL); #endif -#ifdef GDK_WINDOWING_X11 - if (!manager && (backend == NULL || strcmp (backend, "x11") == 0)) - manager = g_initable_new (gdk_x11_display_manager_get_type (), NULL, NULL, NULL); -#endif #ifdef GDK_WINDOWING_WAYLAND if (!manager && (backend == NULL || strcmp (backend, "wayland") == 0)) manager = g_initable_new (gdk_wayland_display_manager_get_type (), NULL, NULL, NULL); #endif +#ifdef GDK_WINDOWING_X11 + if (!manager && (backend == NULL || strcmp (backend, "x11") == 0)) + manager = g_initable_new (gdk_x11_display_manager_get_type (), NULL, NULL, NULL); +#endif #ifdef GDK_WINDOWING_BROADWAY if (!manager && (backend == NULL || strcmp (backend, "broadway") == 0)) manager = g_initable_new (gdk_broadway_display_manager_get_type (), NULL, NULL, NULL); diff --git a/gdk/wayland/gdkdisplaymanager-wayland.c b/gdk/wayland/gdkdisplaymanager-wayland.c index e04a1ea012..68e69d8e41 100644 --- a/gdk/wayland/gdkdisplaymanager-wayland.c +++ b/gdk/wayland/gdkdisplaymanager-wayland.c @@ -38,6 +38,8 @@ struct _GdkWaylandDisplayManager GHashTable *name_to_atoms; guint next_atom; + + gboolean init_failed; }; struct _GdkWaylandDisplayManagerClass @@ -45,12 +47,44 @@ struct _GdkWaylandDisplayManagerClass GdkDisplayManagerClass parent_class; }; -G_DEFINE_TYPE (GdkWaylandDisplayManager, gdk_wayland_display_manager, GDK_TYPE_DISPLAY_MANAGER) +static void g_initable_iface_init (GInitableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GdkWaylandDisplayManager, gdk_wayland_display_manager, GDK_TYPE_DISPLAY_MANAGER, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, g_initable_iface_init)) + +static gboolean +gdk_wayland_display_manager_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + struct wl_display *wl_display; + + /* check that a connection to the default display is possible */ + wl_display = wl_display_connect (gdk_get_display_arg_name ()); + + if (!wl_display) + { + GDK_WAYLAND_DISPLAY_MANAGER (initable)->init_failed = TRUE; + return FALSE; + } + + wl_display_disconnect (wl_display); + + return TRUE; +} + +void +g_initable_iface_init (GInitableIface *iface) +{ + iface->init = gdk_wayland_display_manager_initable_init; +} static void gdk_wayland_display_manager_finalize (GObject *object) { - g_error ("A GdkWaylandDisplayManager object was finalized. This should not happen"); + if (GDK_WAYLAND_DISPLAY_MANAGER (object)->init_failed == FALSE) + g_error ("A GdkWaylandDisplayManager object was finalized. This should not happen"); + G_OBJECT_CLASS (gdk_wayland_display_manager_parent_class)->finalize (object); } -- 2.30.2